/**
 * \file arch.h
 * \author Davide Gessa
 * \date 10-12-09
 */

#ifndef ARCH_H
#define ARCH_H

#include <types.h>


char ARCH[16];		 /// Nome dell'architettura
char CPU_VENDOR[16]; /// Nome del processore



/**
 * Struttura per memorizzare data e ora del sistema
 */
typedef struct
{
	uint8_t hours;			///< Ora
	uint8_t minutes;		///< Minuti
	uint8_t seconds;		///< Secondi
	uint8_t month;			///< Mese
	uint8_t day;			///< Giorno
	uint8_t year;			///< Anno
} clock_data_t;


clock_data_t clock_data;	///< Data e ora globali


/*
 * Cpu
 */
uint32_t cpu_vendor_name(char *);
uint32_t cpu_get_freq();
regs_t cpu_reg_dump();

/*
 * Input Ouput sulle porte della macchina
 */
void io_outb(uint16_t, uint8_t);
uint8_t io_inb(uint16_t);
void io_outw(uint16_t, uint16_t);
uint16_t io_inw(uint16_t);
void io_outd(uint16_t, uint32_t);
uint32_t io_ind(uint16_t);
void io_outl(uint16_t, uint64_t);
uint64_t io_inl(uint16_t);


/*
 * Handler per gli irq
 */
void handler_reg(uint8_t, void (*)(regs_t *r));
void handler_unreg(uint8_t);


/*
 * Timer e Clock
 */
void arch_sleep(uint32_t);
uint32_t arch_get_clock();
uint32_t arch_get_tick();

/*
 * Funzioni per la paginazione
 */
void paged_enable();


/*
 * Funzioni per i task
 */
void task_switch_to_user_mode();

/*
 * Inizializza l'architettura
 */
void arch_init();


#endif
